package com.tabnet.form;

import java.util.Date;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import com.tabnet.beans.gammeproduit.AppelOffre;
import com.tabnet.dao.DAOAppelOffre;
import com.tabnet.dao.DAOException;

public class CreationAppelOffreForm {
	private static final String CHAMP_REF    = "ref";
    private static final String CHAMP_DESC   = "description";

    private String              resultat;
    private HashMap<String, String> erreurs  = new HashMap<String, String>();
    private DAOAppelOffre       appelDao;


    public CreationAppelOffreForm( DAOAppelOffre appelDao ) {
        this.appelDao = appelDao;
    }

    public HashMap<String, String> getErreurs() {
        return erreurs;
    }

    public String getResultat() {
        return resultat;
    }

    /**
     * Méthode qui créer un appel d'offre à partir des données entrées par le gestionnaire.
     * Si aucune erreur, l'appel est enregistré dans la base de données
     * sinon le gestionnaire doit corriger les erreurs.
     * @param request
     * @return AppelOffre
     */
    public AppelOffre creerAppelOffre( HttpServletRequest request ) {
    	
    	// récupération des valeurs
        String ref = getValeurChamp( request, CHAMP_REF );
        String description = getValeurChamp( request, CHAMP_DESC );

        // création des objets
        AppelOffre appelOffre = new AppelOffre();

        // les tests de validation des données
        traiterRef(ref, appelOffre);
        traiterDesc(description, appelOffre);
        appelOffre.set_date(new Date());

        try {
            if ( erreurs.isEmpty() ) {
            	appelDao.addAppelOffre(appelOffre);
                resultat = "Succès de la création de l'appel d'offre.";
            } else {
                resultat = "Échec de la création de l'appel d'offre.";
            }
        } catch ( DAOException e ) {
            setErreur( "imprévu", "Erreur imprévue lors de la création." );
            resultat = "Échec de la création de l'appel d'offre : une erreur imprévue est survenue, merci de réessayer dans quelques instants.";
            e.printStackTrace();
        }

        return appelOffre;
    }
    
    // les traitements
    private void traiterRef( String ref, AppelOffre appel ) {
        try {
            validationRef( ref );
        } catch ( Exception e ) {
            setErreur( CHAMP_REF, e.getMessage() );
        }
        appel.setRef( ref );
    }
    
    private void traiterDesc( String description, AppelOffre appel ) {
        try {
            validationDesc(description);
        } catch ( Exception e ) {
            setErreur( CHAMP_DESC, e.getMessage() );
        }
        appel.setDescription(description);
    }
    
    // les validations
    private void validationRef( String ref ) throws FormValidationException, DAOException {
        if ( ref != null ) {
            if ( ref.length() < 2 ) {
                throw new FormValidationException( "La référence doit contenir au moins 2 caractères." );
            }
        } else {
            throw new FormValidationException( "Merci d'entrer une référence." );
        }
    }

    private void validationDesc( String description ) throws FormValidationException {
        if ( description == null) {
            throw new FormValidationException( "Merci d'entrer une description." );
        }
    }

    /*
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     */
    private void setErreur( String champ, String message ) {
        erreurs.put( champ, message );
    }

    private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
        String valeur = request.getParameter( nomChamp );
        if ( valeur == null || valeur.trim().length() == 0 ) {
            return null;
        } else {
            return valeur;
        }
    }
}
